package com.zmh.common;

import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;

/**
 * 文件操作类
 * @author zhoumh
 * @version 创建时间：2017年10月21日 上午10:30:58
 * @Description
 */
public class FileUtil {
	
	/**
	 * 获取当前工程路径
	 * @return: String 
	 * junit: D:\Work\Workspace\eclipse\wechat\target\test-classes\
	 * web: D:\Work\Tomcat\apache-tomcat-8.0.32\bin  D:\Work\Workspace\eclipse\wechat\target\test-classes\
	 * @author: zhoumh
	 * @version: 创建时间：2017年11月2日 上午9:27:22 
	 * @Description:
	 */
	public static String getStaticPath(){
		String courseFile = null;
		File directory = new File("");// 参数为空
        try {
			courseFile = directory.getCanonicalPath();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        return courseFile;
	}
    /**
     * 得到当前应用的系统路径
     * @return: String
     * junit: D:\Work\Workspace\eclipse\wechat\target\test-classes\
     * web: D:\Work\Tomcat\apache-tomcat-8.0.32\webapps\wechat\
     * @author: zhoumh
     * @version: 创建时间：2017年11月2日 上午9:27:51 
     * @Description: 
     */
     public static String getSysPath() {
        //从classpath根开始查找
         String path = Thread.currentThread().getContextClassLoader()
                 .getResource("").toString();
         String temp = path.replaceFirst("file:/", "").replaceFirst(
                 "WEB-INF/classes/", "");
         //文件分隔符（在 UNIX 系统中是“/”）
         String separator = System.getProperty("file.separator");
         String resultPath = temp.replaceAll("/", separator + separator);
         return resultPath;
     }
     
     /*
      * replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是：
      * 1)replace的参数是char和CharSequence，即可以支持字符的替换，也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串)；
      * 2)replaceAll的参数是regex，即基于规则表达式的替换，比如，可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号;
      */

     /**
      * 得到当前应用生成class文件的系统路径
      * @return: String       
      * junit: D:\Work\Workspace\eclipse\wechat
      * web: D:\Work\Tomcat\apache-tomcat-8.0.32\webapps\wechat\WEB-INF\classes\
      * @author: zhoumh
      * @version: 创建时间：2017年11月2日 上午9:28:00 
      * @Description: 
      */
      public static String getClassPath() {
          String path = Thread.currentThread().getContextClassLoader()
                  .getResource("").toString();
          String temp = path.replaceFirst("file:/", "");
          //获取当前系统的分隔符并进行替换
          String separator = System.getProperty("file.separator");
          String resultPath = temp.replaceAll("/", separator + separator);
          return resultPath;
      }
 
	/**
	 * 删除目录或文件
	 * @param sPath
	 * @return: boolean
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月21日 上午10:33:17
	 * @Description:
	 */
	public static boolean deleteFolder(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 判断目录或文件是否存在
		if (!file.exists()) { // 不存在返回 false
			return flag;
		} else {
			// 判断是否为文件
			if (file.isFile()) { // 为文件时调用删除文件方法
				return deleteFile(sPath);
			} else { // 为目录时调用删除目录方法
				return deleteDirectory(sPath);
			}
		}
	}
	/**
	 * 删除单个文件
	 * @param sPath 被删除文件的文件名
	 * @return: boolean
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月21日 上午10:33:46
	 * @Description:
	 */
	public static boolean deleteFile(String sPath) {
		try {
			boolean flag = false;
			File file = new File(sPath);
			// 路径为文件且不为空则进行删除
			if (file.isFile() && file.exists()) {
				file.delete();
				flag = true;
			}
			return flag;
		} catch (Exception e) {
			return false;
		}
	}
	/**
	 * 删除目录（文件夹）以及目录下的文件
	 * @param sPath 被删除目录的文件路径
	 * @return: boolean
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月21日 上午10:34:15
	 * @Description:
	 */
	public static boolean deleteDirectory(String sPath) {
		// 如果sPath不以文件分隔符结尾，自动添加文件分隔符
		if (!sPath.endsWith(File.separator)) {
			sPath = sPath + File.separator;
		}
		File dirFile = new File(sPath);
		// 如果dir对应的文件不存在，或者不是一个目录，则退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return false;
		}
		boolean flag = true;
		// 删除文件夹下的所有文件(包括子目录)
		File[] files = dirFile.listFiles();
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				// 删除子文件
				if (files[i].isFile()) {
					flag = deleteFile(files[i].getAbsolutePath());
					if (!flag)
						break;
				} // 删除子目录
				else {
					flag = deleteDirectory(files[i].getAbsolutePath());
					if (!flag)
						break;
				}
			}
		}
		if (!flag)
			return false;
		// 删除当前目录
		if (dirFile.delete()) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 获取文件大小
	 * @param file
	 * @return: float
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月21日 上午10:34:34
	 * @Description:
	 */
	public static float getFileSize(File file) {
		float length = file.length();
		String format = new DecimalFormat("0.0").format(length / 1048576f);
		return Float.parseFloat(format);
	}

	/**
	 * 删除目录下的文件
	 * @param sPath
	 * @author: zhoumh
	 * @version: 创建时间：2017年10月21日 上午10:34:52
	 * @Description:
	 */
	public static void deleteFilesInFloder(String sPath) {
		// 如果sPath不以文件分隔符结尾，自动添加文件分隔符
		if (!sPath.endsWith(File.separator)) {
			sPath = sPath + File.separator;
		}
		File dirFile = new File(sPath);
		// 如果dir对应的文件不存在，或者不是一个目录，则退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return;
		}
		boolean flag = true;
		// 删除文件夹下的所有文件(包括子目录)
		File[] files = dirFile.listFiles();
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				// 删除子文件
				if (files[i].isFile()) {
					flag = deleteFile(files[i].getAbsolutePath());
					if (!flag)
						break;
				} // 删除子目录
				else {
					flag = deleteDirectory(files[i].getAbsolutePath());
					if (!flag)
						break;
				}
			}
		}
	}
}
